/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DBLag;
import ModelLag.*;
import java.sql.*;
import java.util.ArrayList;

/**
 * Databaseklasse for Lane som står for kommunikationen til databasen og som står
 * for opbygningen af Lane objekter som skal bruges i de højere lag.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class DbLane implements IFDbLane
{
    //Forbindelse til databasen.
    private Connection con;
    
    // En instans variabel af typen PreparedStatement som indeholder et PreparedStatement
    // til brug ved findmetode.
    private PreparedStatement pStmtSelect;
    
    public DbLane()
    {
        con = DbConnection1.getInstance().getDBcon();
    }

    /**
     * Finder en event i databasen og sørger for at det bliver bygget op til et 
     * objekt ved hjælp af buildLane() og lane nummer.
     * @param laneNo Bane nummer
     * @return Hvis fundet returneres et Event objekt ellers null.
     */       
    @Override
    public Lane findLane(int LaneNo, boolean retriveAssociation)
    {
        if(pStmtSelect == null)
        {
            pStmtSelect = getPreparedStmt();
        }
        Lane laneObj = null;
        ResultSet results;
        
        try
        {
            pStmtSelect.setInt(1, LaneNo);
            results = pStmtSelect.executeQuery();
            if(results.next())
            {
                laneObj = buildLane(results);
            }
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return laneObj;  
    }
     
    /**
     * Henter alle rækker i Lane tabellen i databasen og bygger dem op til objekter ved hjælp af
     * buildLane() og derefter tilføjes hvert objekt til en ArrayList.
     * @return ArrayList med alle event som findes i Lane tabellen i databasen.
     */
    @Override
    public ArrayList<Lane> getAllLanes()
    {
        ArrayList<Lane> list = new ArrayList<Lane>();
        PreparedStatement pstmt = null;
        
        String allLane = "SELECT * FROM Lane ORDER BY laneNo";
        
        //System.out.println(allLane);
        
        Lane laneObj = null;
        ResultSet results;
        
        try
        {
            pstmt = con.prepareStatement(allLane);
            pstmt.setQueryTimeout(5);
            results = pstmt.executeQuery();
            while(results.next())
            {
               laneObj = buildLane(results);
               list.add(laneObj);
            }
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return list;
            
    /**
     * Indsætter et Lane objekt som en række i Lane tabellen i databasen.
     * @param laneObj Det objekt som ønskes indsat i Event tabellen i databasen.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */ 
    }
    @Override
    public int insertLane(Lane laneObj, boolean retriveAssociation)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String insert = "INSERT INTO Lane (laneNo)" + "VALUES (?)";
        //System.out.println(insert);
        try
        {
            pstmt = con.prepareStatement(insert);
            pstmt.setQueryTimeout(5);
            pstmt.setInt(1, laneObj.getLaneNo());
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());

        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());

        }
        return rc;
    }
        
    /**
     * Sletter rækken i Lane tabellen i databasen ved hjælp af parameterne.
     * @param laneNo Bane nummer.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */    
    @Override
    public int deleteLane(int laneNo)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String delete = "DELETE FROM Lane WHERE laneNo = ?";
        //System.out.println(delete);
        try
        {
            pstmt = con.prepareStatement(delete);
            pstmt.setQueryTimeout(5);
            pstmt.setInt(1, laneNo);
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage()); 
        }
        catch(Exception e)
        {
            e.getMessage();
        }
        return rc;
    }
        
    /**
     * Opdaterer rækken i Lane tabellen i databasen i forhold til event objektet.
     * @param laneObj Lane objekt som er det der skal opdateres.
     * @param laneNo Bane nummer.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */  
    @Override
    public int updateLane(Lane lane)
    {

        int rc = -1;

        String query = null;

        try
        {
        
            query = "UPDATE Lane " 
                  + "SET laneNo = ?"
                  + "WHERE laneNo = " + lane.getLaneNo();

            PreparedStatement preStmnt = con.prepareStatement(query);
            preStmnt.setQueryTimeout(5);
            //System.out.println(query);

            preStmnt.setInt(1, lane.getLaneNo());
 
            rc = preStmnt.executeUpdate();
            
            preStmnt.close();
                
        }
        catch(SQLException SQLe)
        {
            //returnerer SQL Exception
            System.out.println("SQL Error: " + SQLe.getMessage());

        }
        catch(Exception e)
        {
            //returnerer java exception
            System.out.println("ExceptionE: " + e.getMessage());

        }        
        return rc;
    }
    
       
    /**
     * Opbygning af Lane objekt sker i denne metode.
     * @param results ResultSet. En form for tabel med resultaterne i fra det
     * preparedstatement som er sendt til databasen.
     * @return Lane objekt.
     */ 
    private Lane buildLane(ResultSet results)
    {
        Lane laneObj = new Lane();
        try
        {   
            laneObj.setLaneNo(results.getInt("laneNo"));
           
        }
        catch(Exception e)
        {
            System.out.println("Error in Building Lane Object");
        }
        return laneObj;
    }
       
    /**
     * PreparedStatement som bruges til find metoden ud fra eventName. Dette laves en gang og gemmes
     * derefter i en instans variabel, da dette preparedStatement bruges ofte kan
     * dette betale sig at gemme og derved går det hurigtere end hvis man skal til at
     * lave et nyt hver gang.
     * @return PreparedStatement objekt.
     */ 
    private PreparedStatement getPreparedStmt()
    {
        try
        {
            String query = "SELECT laneNo "
                         + "FROM Lane "
                         + "WHERE laneNo = ?";
            //System.out.println("Preparestatement " + query);
            pStmtSelect = con.prepareStatement(query);
            pStmtSelect.setQueryTimeout(5);
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        return pStmtSelect;
    }
    




}